﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL;
using System.Data;
using System.IO;
using System.Configuration;
using System.Transactions;
using System.Data.Linq;
using System.ComponentModel;
using UtilityExtensions;

namespace BOL.Ventas
{
    public class GetPendientePagoList
    {
        int _count;





        public int Count(int idConcepto,
                            int idCliente,
                            int idMoneda,
                         int startRowIndex,
                         int maximumRows,
                         string sortExpression)
        {
            return _count;
        }

        public int Count(int idConcepto,
                           int idCliente,
                           int idMoneda,
                            int idProyecto,
                        int startRowIndex,
                        int maximumRows,
                        string sortExpression)
        {
            return _count;
        }

        public int Count(int idConcepto,
                          int idMoneda,
                        int startRowIndex,
                        int maximumRows,
                        string sortExpression,
                        int idProyecto)
        {
            return _count;
        }


        public int Count(string idConcepto,
                          int idProyecto,
                          int startRowIndex,
                         int maximumRows,
                         string sortExpression)
        {
            return _count;
        }

        public int Count(int idCliente,
                         int idOrdenVentaItem,
                         int startRowIndex,
                         int maximumRows,
                         string sortExpression)
        {
            return _count;
        }
       


        private IQueryable<PendientePagoInfo> ApplySelect_ListInfo()
        {
            var q = from a in DbUtil.Db.OrdenVentaFormatos
                    select new PendientePagoInfo
                    {   
                        idProyecto=a.OrdenVentaItem.OrdenVenta.idProyecto,
                        idConcepto=a.idConcepto,
                        concepto=a.ConceptoItem.descripcion,
                        documento=a.numDocumento,
                        idCliente = a.OrdenVentaItem.OrdenVenta.idCliente,
                        idInternal = a.idInternal,
                        totalOrig=a.total,
                        total=a.total-a.totalFin-a.totalPago,
                        totalStr=string.Format("{0} {1:N}",a.Moneda.simbol,a.total-a.totalFin-a.totalPago),
                        idMoneda=a.idMoneda,
                        idOrdenVentaItem=a.idOrdenVentaItem,
                        fechaVencimiento=a.fechaVencimiento,
                        fechaVencimientoStr=a.fechaVencimiento.ToShortDateString(),
                        tipoDocumento=string.Empty,
                        UIStr=a.OrdenVentaItem.UI.descripcion,
                        cliente=a.OrdenVentaItem.OrdenVenta.Cliente.descripcion,
                        etapa = a.OrdenVentaItem.UI.Etapa.descripcion,
                        //documentoVenta=(a.bitFacturado==true)?string.Format("{0} {1}",
                          //                      a.DocumentoVenta.DocumentoTipo.abreviacion,a.DocumentoVenta.numeroDoc):"",
                        localizacion = string.Format("{0} {1}", a.OrdenVentaItem.UI.UILocalizacion.descripcion, 
                                                                a.OrdenVentaItem.UI.UIBloque.descripcion),
                        ordenVenta=a.OrdenVentaItem.OrdenVenta.numDocumento,
                        idOrdenVenta=a.OrdenVentaItem.idOrdenVenta
                    };
            return q;
        }
        private IQueryable<PendientePagoInfo> ApplySort(IQueryable<PendientePagoInfo> q, string sortExpression)
        {
            switch (sortExpression)
            {
                case "concepto":
                    q = q.OrderBy(b => b.concepto);
                    break;
                case "concepto DESC":
                    q = q.OrderByDescending(b => b.concepto);
                    break;

                case "documento":
                    q = q.OrderBy(b => b.documento);
                    break;
                case "documento DESC":
                    q = q.OrderByDescending(b => b.documento);
                    break;



                case "total":
                    q = q.OrderBy(b => b.total);
                    break;
                case "total DESC":
                    q = q.OrderByDescending(b => b.total);
                    break;

                default:
                    q = q.OrderByDescending(b => b.idConcepto);
                    break;
            }
            return q;
        }


        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public IEnumerable<PendientePagoInfo> Execute(int idConcepto,int idCliente,
                                                             int idMoneda,
                                                             int startRowIndex,
                                                             int maximumRows,
                                                             string sortExpression)
        {


            var q = ApplySelect_ListInfo();

            // todas las cuotas de pago mayor a 10
            var qq = q.Where(a => 
                            a.total > 0 
                            & a.totalOrig > 0
                            & a.idMoneda== idMoneda
                            & a.idCliente==idCliente
                            & (idConcepto == 1 ? (a.idConcepto == 1 | a.idConcepto > 9) : a.idConcepto == idConcepto));


            _count = qq.Count();

            qq = ApplySort(qq, sortExpression);
            return qq.Skip(startRowIndex).Take(maximumRows);
        }

        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public IEnumerable<PendientePagoInfo> Execute(int idConcepto, 
                                                            int idCliente,
                                                             int idMoneda,
                                                                int idProyecto,
                                                             int startRowIndex,
                                                             int maximumRows,
                                                             string sortExpression)
        {


            var q = ApplySelect_ListInfo();

            // todas las cuotas de pago mayor a 10
            var qq = q.Where(a =>
                            a.total > 0
                            & a.idProyecto==idProyecto
                            & a.totalOrig > 0
                            & a.idMoneda == idMoneda
                            & a.idCliente == idCliente
                            & (idConcepto == 1 ? (a.idConcepto == 1 | a.idConcepto == 4 | a.idConcepto > 9) : a.idConcepto == idConcepto));


            _count = qq.Count();

            qq = ApplySort(qq, sortExpression);
            return qq.Skip(startRowIndex).Take(maximumRows);
        }



        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public IEnumerable<PendientePagoInfo> Execute(int idConcepto, 
                                                             int idMoneda,
                                                             int startRowIndex,
                                                             int maximumRows,
                                                             string sortExpression,
                                                             int idProyecto)
        {


            var q = ApplySelect_ListInfo();

            // todas las cuotas de pago mayor a 10
            var qq = q.Where(a =>
                            a.total > 0
                            & a.totalOrig > 0
                            & a.idMoneda == idMoneda
                            & a.idProyecto == idProyecto
                            & (idConcepto == 1 ? (a.idConcepto == 1 | a.idConcepto > 9) : a.idConcepto == idConcepto));


            _count = qq.Count();

            qq = ApplySort(qq, sortExpression);
            return qq.Skip(startRowIndex).Take(maximumRows);
        }




        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public IEnumerable<PendientePagoInfo> Execute(int idCliente,
                                                      int idOrdenVentaItem,
                                                      int startRowIndex,
                                                      int maximumRows,
                                                      string sortExpression)
        {


            var q = ApplySelect_ListInfo();

            // todas las cuotas de pago mayor a 10
            q = q.Where(a => (a.total > 0)
                            & a.idOrdenVentaItem == idOrdenVentaItem
                            & a.idCliente == idCliente
                            
                           );


            _count = q.Count();

            q = ApplySort(q, sortExpression);
            return q.Skip(startRowIndex).Take(maximumRows);
        }


        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public IEnumerable<PendientePagoInfo> Execute(string idConcepto, int idProyecto,
                                           
                                                             int startRowIndex,
                                                             int maximumRows,
                                                             string sortExpression)
        {


            var q = ApplySelect_ListInfo();
            int idConceptoInt = idConcepto.ToInt();
            // todas las cuotas de pago mayor a 10
            q = q.Where(a => (a.total > 0)
                            & a.totalOrig > 0
                            & a.idProyecto==idProyecto
                            & (idConceptoInt == 1 ? (a.idConcepto == 1 | a.idConcepto > 9) : a.idConcepto == idConceptoInt));


            _count = q.Count();

            q = ApplySort(q, sortExpression);
            return q.Skip(startRowIndex).Take(maximumRows);
        }

                        

    }
}
